<?php
/*************
* Clase BAPElement
*	- elemento generico
*/

function __DEBUG__($objeto) {
	echo "<pre>";
	print_r($objeto);
	echo "</pre>";
}

abstract class BAPElement {

	/** Contenedor de elementos hijos de este elemento */
	var $children = array();
	
	/** Nombre del elemento */
	var $name = null;
	
	/** Valor (si se corresponde) */
	var $value = null;
	
	/** Parser general. Es necesario guardarlo porque en realidad ira pasandose de un elemento a otro 
		NOTA: podria ser global, pero he preferido ponerlo como variable y pasarlo por referencia para que
			se puedan analizar de forma simultanea distintos ficheros
	*/
	var $parser = null;
	
	function __construct(&$parser) {
		$this->parser = $parser;
	}
	
	/** Funcion que creara un objeto de la clase, si todo ha ido bien
		NOTA: modifica el estado del parser
	*/
	static protected function &create($classname, &$parser) {

		$objeto = new $classname(&$parser);
		
		if ($objeto->parse()) {
			$objeto->parser = null;
			// __DEBUG__("{$classname}::create returns object");
			return $objeto;
		}

		// __DEBUG__("{$classname}::create returns null (2)");
		return null;
	}
	
	/** Funcion que permite obtener una cadena que representa al contenido actual del elemento */
	/** Funcion que parsea el elemento. Solo es invocada por los creadores 
		NOTA: modifica el estado del parser
	*/
	abstract public function parse();
	
	/** Esta funcion devuelve un template hijo con un nombre determinado */
	function &getTemplate($templateName) {
		foreach ($this->children as &$nodo) {
			if (is_a($nodo,"BAPTemplate")) {
				if (trim($nodo->name) == $templateName) {
					return $nodo;
				}
			}
		}
		return null;
	}

	/** Esta funcion devuelve un elemento hijo con un nombre determinado */
	function &getNode($nodeName) {
		if (is_string($nodeName)) {
			$nodeName = trim($nodeName);
			if ($nodeName!='') {
				foreach ($this->children as &$nodo) {
					if (trim($nodo->name) == $nodeName) {
						return $nodo;
					}
				}
			} else {
				return null;
			}
		}
		if (is_int($nodeName)) {
			if ($nodeName < count($this->children)) {
				return $this->children[$nodeName];
			}
		}
		return null;
	}
	
	/** Esta funcion devuelve el valor de este elemento */
	function getValue() {
		$valor = $this->value;
		foreach ($this->children as &$nodo) {
			$valor=$valor.$nodo;
		}
		return $valor;
	}
	
	function __toString() {
		return get_class();
	}

}
?>